import MarkdownIt from 'markdown-it';
import hljs from 'highlight.js';
import 'highlight.js/styles/github.css';

// 初始化 MarkdownIt 实例，配置高亮渲染
const md = new MarkdownIt({
  html: true,
  linkify: true,
  typographer: true,
  highlight: function (str, lang) {
    if (lang && hljs.getLanguage(lang)) {
      try {
        const highlighted = hljs.highlight(str, { 
          language: lang, 
          ignoreIllegals: true 
        }).value;
        return `<pre class="hljs"><div class="code-header">
          <span class="code-lang">${lang}</span>
        </div><code class="${lang}">${highlighted}</code></pre>`;
      } catch (__) {}
    }
    return `<pre class="hljs"><code>${md.utils.escapeHtml(str)}</code></pre>`;
  },
});

// 在段落解析之前加入自定义的文件链接规则，匹配类似 [file:xls]...[/file] 格式
md.block.ruler.before(
  'paragraph',
  'file_link',
  (state, startLine, endLine, silent) => {
    const startPos = state.bMarks[startLine] + state.tShift[startLine];
    const maxPos = state.eMarks[startLine];
    const lineText = state.src.slice(startPos, maxPos).trim();
    // 正则匹配 [file:type] 和 [/file]，支持中文、符号、空格等复杂内容
    const match = lineText.match(/\[file:([\w-]+)\]([\s\S]+?)\[\/file\]/);
    if (!match) return false;

    // 如果是静默模式，返回 true 表示匹配成功
    if (silent) return true;

    // 创建 token 并保存匹配结果
    const token = state.push('file_link', '', 0);
    token.block = true;
    token.info = {
      type: match[1].toLowerCase(), // 文件类型，例如 xls
      url: match[2].trim(), // 文件 URL
    };

    // 跳过当前行
    state.line = startLine + 1;
    return true;
  }
);

// 自定义渲染器：将文件 token 渲染成文件卡片样式，包含文件信息和文件类型图标
md.renderer.rules.file_link = (tokens, idx) => {
  const { type, url } = tokens[idx].info;

  // 图标映射，根据文件类型设置不同的图标
  const iconMap = {
    pdf: 'file-pdf',
    xls: 'file-excel',
    xlsx: 'file-excel',
    doc: 'file-word',
    docx: 'file-word',
    ppt: 'file-powerpoint',
    pptx: 'file-powerpoint',
    zip: 'file-zipper',
    rar: 'file-zipper',
    default: 'file',
  };

  // 从 URL 中提取文件名
  let fileName = url.split('/').pop() || url;
  try {
    fileName = decodeURIComponent(fileName);
  } catch (e) {
    // 解码失败则保持原样
  }

  return `
    <div class="file-card" data-url="${url}" onclick="previewFile('${url}')">
      <div class="file-info">
        <div class="file-name">${md.utils.escapeHtml(fileName)}</div>
      </div>
      <div class="file-icon">
        <i class="fa-solid fa-${iconMap[type] || iconMap.default}"></i>
      </div>
    </div>
  `;
};

// 导出渲染 Markdown 的函数
export const renderMarkdown = (content) => {
  try {
    return md.render(content);
  } catch (err) {
    console.error('Markdown解析错误:', err);
    return content || '';
  }
};

// 全局预览/下载文件函数，点击文件卡片时触发
window.previewFile = function (url) {
  window.open(url, '_blank');
};